# 函数
# def 函数名 (参数名1,参数名2,......):
#     函数体（代码）
#     函数体（代码）
#     函数体（代码）
#     函数体（代码）
#     return 返回值

# n的阶乘 10*9*8*7......
# 方式一：使用循环
# 方式二：递归（1：有结束条件；2：自己调用自己）
# 参数：n
# 返回值：int类型
def jieCheng(n):
    count = n
    result = 1
    while count >= 1:
        result = result * count
        count = count - 1
    return result


print(jieCheng(5))


# 使用递归(开销较大，尽量避免使用)
# 1.停止条件
# 2.自己调用自己
def jieChengPlus(n):
    # 停止条件
    if n == 1:
        return n
    # 自己调用自己
    return n * jieChengPlus(n - 1)


print(jieChengPlus(4))


# 4！=4*3*2*1
# jieChengPlus(4)
#       4 * jieChengPlus(3)
#           4 * 3 * jieChengPlus(2)
#               4 * 3 * 2 * jieChengPlus(1)
#                   4 * 3 * 2 * 1

# 默认参数
def point(name, age=18):
    print(name, age)


point("张三", 20)
point("小红")


# 可变参数
# String ... args
def func1(*args):
    print(args)


func1(1)
func1(1, 2)
func1(1, 2, 3)
func1(1, 2, 3, 4)


# 关键字参数
# 会将传入的参数组装成字典
# 调用的时候传参需要按照 func2(name="zhangSan", age=18) 这种写法传入
def func2(**kw):
    print(kw)


func2(name="zhangSan", age=18)


# 匿名函数

# 函数式编程语言
# 函数可以作为参数传入
# 函数也可以作为返回值

# 求n的平方
def func3(n):
    return n ** 2


# 简写方式，使用lambda表达式
func4 = lambda n: n ** 2
print(func3(10))
print(func4(10))

func5 = lambda x, y: x ** y
print(func5(2, 3))

list1 = [(1, 5), (3, 3), (2, 4)]
list1.sort(key=lambda x: x[1])
print(list1)


# 函数做为参数传入
def func6(func):
    print("开始时间为：")
    print(func(3))
    print("结束时间为：")


func4 = lambda n: n ** 2
func6(func4)


# 函数做为返回值

def func7():
    return lambda x: print(x)


func8 = func7()
func8("hello")

func7()("hello")
